From: Matthew Owens <matthew@owens.tech>
Date: Sat, 25 Dec 2021 17:31:49 +0000 (+0000)
Subject: implemented queue
X-Git-Url: https://git.owens.tech/assets/lich_lifts_title_slice.png%20%22Lich%20Lifts%22/assets/lich_lifts_title_slice.png%20%22Lich%20Lifts%22/git?a=commitdiff_plain;h=ab629f0184ee94f798306c4d990d16b864c30f67;p=AbyssalThistle%2Fqueue.git

implemented queue
---

diff --git a/src/queue.c b/src/queue.c
index 4ebd3f3..e5e9e0a 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -1 +1,99 @@
 #include "queue.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+void QueueInit(Queue *q, size_t memSize)
+{
+	assert(q != NULL);
+	assert(memSize > 0);
+
+	q->memSize = memSize;
+	q->tail = NULL;
+	q->head = NULL;
+}
+
+void QueuePush(Queue *q, const void *data)
+{
+	assert(q != NULL);
+	QueueNode *n = malloc(sizeof(QueueNode));
+
+	assert(n != NULL);
+	n->data = malloc(q->memSize);
+	assert(n->data != NULL);
+	n->next = NULL;
+
+	memcpy(n->data, data, q->memSize);
+
+	if(q->head == NULL) {
+		q->head = q->tail = n;
+	} else {
+		q->tail->next = n;
+		q->tail = n;
+	}
+}
+
+void QueuePop(Queue *q, void *data)
+{
+	assert(q != NULL);
+	assert(q->head != NULL);
+
+	QueueNode *tmp = q->head;
+
+	if(data != NULL) {
+		memcpy(data, q->head->data, q->memSize);
+	}
+	q->head = q->head->next;
+
+	if(q->head == NULL) {
+		q->tail = NULL;
+	}
+
+	free(tmp->data);
+	free(tmp);
+}
+
+void QueuePeek(Queue *q, void *data)
+{
+	assert(q != NULL);
+	assert(q->head != NULL);
+	assert(q->head->data != NULL);
+	assert(data != NULL);
+
+	memcpy(data, q->head->data, q->memSize);
+}
+
+void QueueClear(Queue *q)
+{
+	assert(q != NULL);
+	if(q->head == NULL) { return; }
+
+	int count = 0;
+	QueueNode *tmp = NULL;
+	do {
+		tmp = q->head;
+		count++;
+		q->head = tmp->next;
+		free(tmp->data);
+		free(tmp);
+	}
+	while(tmp != q->tail);
+
+	q->head = q->tail = NULL;
+}
+
+size_t QueueGetSize(Queue *q)
+{
+	size_t size = 0;
+	assert(q != NULL);
+	if(q->head == NULL) { return 0; }
+
+	QueueNode *head = q->head;
+	do {
+		size++;
+		head = head->next;
+	} while(head != q->tail);
+
+
+	return size;
+}
diff --git a/src/queue.h b/src/queue.h
index 6f70f09..8082064 100644
--- a/src/queue.h
+++ b/src/queue.h
@@ -1 +1,20 @@
 #pragma once
+#include <stddef.h>
+
+typedef struct QueueNode {
+	void *data;
+	struct QueueNode *next;
+} QueueNode;
+
+typedef struct Queue {
+	size_t memSize;
+	QueueNode *tail;
+	QueueNode *head;
+} Queue;
+
+void QueueInit(Queue *q, size_t memSize);
+void QueuePush(Queue *q, const void *data);
+void QueuePop(Queue *q, void *data);
+void QueuePeek(Queue *q, void *data);
+void QueueClear(Queue *q);
+size_t QueueGetSize(Queue *q);